//package com.example.demo.common.algorithm.sm2;/**
// * Created by penglee on 2019/7/25.
// */
//
//import com.example.demo.common.algorithm.Cipher;
//import com.example.demo.common.algorithm.Util;
//import org.bouncycastle.crypto.AsymmetricCipherKeyPair;
//import org.bouncycastle.crypto.params.ECPrivateKeyParameters;
//import org.bouncycastle.crypto.params.ECPublicKeyParameters;
//import org.bouncycastle.math.ec.ECPoint;
//
//import java.io.IOException;
//import java.math.BigInteger;
//
///**
// * SM2Utils
// * <p>
// * Description: <br>
// * Created in 2019/7/25 17:02 <br>
// *
// * @author 李鹏
// */
//public class SM2Utils {
//    /**
//     * 生成随机秘钥对
//     */
//    public static String[] generateKeyPair() {
//        SM2 sm2 = SM2.Instance();
//        AsymmetricCipherKeyPair key = sm2.ecc_key_pair_generator.generateKeyPair();
//        ECPrivateKeyParameters ecpriv = (ECPrivateKeyParameters) key.getPrivate();
//        ECPublicKeyParameters ecpub = (ECPublicKeyParameters) key.getPublic();
//        BigInteger privateKey = ecpriv.getD();
//        ECPoint publicKey = ecpub.getQ();
//        String[] result = new String[2];
//        result[0] = Util.byteToHex(publicKey.getEncoded(false));
//        result[1] = Util.byteToHex(privateKey.toByteArray());
//        return result;
//
//    }
//
//    /**
//     * 数据加密
//     */
//    public static String encrypt(byte[] publicKey, byte[] data) throws IOException {
//        if (publicKey == null || publicKey.length == 0) {
//            return null;
//        }
//
//        if (data == null || data.length == 0) {
//            return null;
//        }
//
//        byte[] source = new byte[data.length];
//        System.arraycopy(data, 0, source, 0, data.length);
//
//        Cipher cipher = new Cipher();
//        SM2 sm2 = SM2.Instance();
//        ECPoint userKey = sm2.ecc_curve.decodePoint(publicKey);
//
//        ECPoint c1 = cipher.Init_enc(sm2, userKey);
//        cipher.Encrypt(source);
//        byte[] c3 = new byte[32];
//        cipher.Dofinal(c3);
//
////      System.out.println("C1 " + Util.byteToHex(c1.getEncoded()));
////      System.out.println("C2 " + Util.byteToHex(source));
////      System.out.println("C3 " + Util.byteToHex(c3));
//        /** C1 C2 C3拼装成加密字串 */
//        return Util.byteToHex(c1.getEncoded(false)) + Util.byteToHex(source) + Util.byteToHex(c3);
//
//    }
//
//    /**
//     * 数据解密
//     */
//    public static byte[] decrypt(byte[] privateKey, byte[] encryptedData) throws IOException {
//        if (privateKey == null || privateKey.length == 0) {
//            return null;
//        }
//
//        if (encryptedData == null || encryptedData.length == 0) {
//            return null;
//        }
//        /** 加密字节数组转换为十六进制的字符串 长度变为encryptedData.length * 2  */
//        String data = Util.byteToHex(encryptedData);
//        /** 分解加密字串
//         * （C1 = C1标志位2位 + C1实体部分128位 = 130）
//         * （C3 = C3实体部分64位  = 64）
//         * （C2 = encryptedData.length * 2 - C1长度  - C2长度）
//         */
//        byte[] c1Bytes = Util.hexToByte(data.substring(0, 130));
//        int c2Len = encryptedData.length - 97;
//        byte[] c2 = Util.hexToByte(data.substring(130, 130 + 2 * c2Len));
//        byte[] c3 = Util.hexToByte(data.substring(130 + 2 * c2Len, 194 + 2 * c2Len));
//
//        SM2 sm2 = SM2.Instance();
//        BigInteger userD = new BigInteger(1, privateKey);
//
//        /** 通过C1实体字节来生成ECPoint */
//        ECPoint c1 = sm2.ecc_curve.decodePoint(c1Bytes);
//        Cipher cipher = new Cipher();
//        cipher.Init_dec(userD, c1);
//        cipher.Decrypt(c2);
//        cipher.Dofinal(c3);
//
//        /** 返回解密结果 */
//        return c2;
//    }
//
//    public static void main(String[] args) throws Exception {
//        /** 生成密钥对 */
//        String[] result = generateKeyPair();
//
//        System.out.println("公钥: " + result[0]);
//        System.out.println("私钥: " + result[1]);
//
//        String plainText = "hello world";
//        byte[] sourceData = plainText.getBytes();
//
//        /**
//         * 下面的秘钥可以使用generateKeyPair()生成的秘钥内容
//         * 国密规范正式私钥
//         */
//        String prik = "056C0843CDC57CFF73BCE35F39540D8FA2B4FEF096DE41C63FBC159C9C6FCA96";
//        /** 国密规范正式公钥 */
//        String pubk = "0423DAE5F10BE59CBBD21BD71BACF57DFFC6D3BFD4FA3A23211F773FCB00AE30A89EFCBAE38465F7F5230158AE95E80F8549E67204F7FA6E7DD9FF8D75417F44C5";
//
//        System.out.println("加密: ");
//        String cipherText = SM2Utils.encrypt(Util.hexToByte(pubk), sourceData);
//        System.out.println(cipherText);
//        System.out.println("解密: ");
//        plainText = new String(SM2Utils.decrypt(Util.hexToByte(prik), Util.hexToByte(cipherText)));
//        System.out.println(plainText);
//    }
//}
